Notebook Computer Vision

Sommaire

  1. Import des librairies
  2. Chargement des données
  3. Analyse des photos
  4. Exemple d'extractions de features
    1. Traitement de l'image
    2. Extraction des features
  5. Extraction de features sur toutes les images
    1. Traitement des images et extraction des features avec SIFT
    2. kMeans - clustering des descripteurs
    3. ACP
    4. TSNE
    5. kMeans - clustering des images en 2 dimensions
  6. Utilisation d'un CNN (Réseau de neurones convolutif)
    1. Exemple avec l'algo VGG16
    2. Extraction de features
    3. Transfer Learning

Import des librairies

Chargement des données

Analyse des photos

Exemple d'extractions de features

Traitement de l'image

Extraction des features

La scale-invariant feature transform (SIFT) est un algorithme utilisé pour détecter et identifier les éléments similaires entre différentes images numériques.

Il convient de traiter l'image avant d'utiliser l'algorithme SIFT, il s'agit en fait de normaliser son niveau de gris pour corriger la luminosité, le contraste, puis éliminer l'éventuel bruit, ce qui floutera un peu l'image mais ce n'est pas gênant pour l'extraction des features.

L'algorithme SIFT va ensuite calculer des descripteurs (fixés à 500 dans notre cas), qui sont des caractéristiques du contenu visuel de l'image, indépendamment du zoom, du cadrage, de l'angle de vision ..

Ainsi, des photographies d'un même objet auront toutes les chances d'avoir des descripteurs SIFT similaires.

Extractions de features sur toutes les images

On va donc réutiliser la technique de traitement et l'algorithme SIFT de l'exemple précédent, pour l'appliquer à tout notre échantillon d'images.

Traitement des images et extraction des features avec SIFT

kMeans - clustering des descripteurs

On a calculé 500 descripteurs pour chaque image.

On va maintenant utiliser l'algorithme kMeans pour clusteriser la totalité des descripteurs.

Chaque histogramme d'une image représente un pourcentage d'appartenance des ses descripteurs à chaque cluster calculé par le kMeans précédent.

On va maintenant réduire le nombre de dimensions avec l'ACP, et on garde un nombre de dimensions de façon à avoir une variance expliquée à 99%.

ACP

On passe de 695 à 551 features avec l'ACP.

On va maintenant réduire l'espace de dimension avec l'algorithme TSNE, pour obtenir 2 dimensions et pouvoir visualiser sous forme de nuage de points les images et leur label associé.

TSNE

On voit que "menu' se distingue des autres clasess. "food" et "drink" se retrouvent ensemble ainsi que "inside" et "outside".

La distinction est tout de même difficile à effectuer.

On va maintenant clusteriser ces données en 2 dimensions avec l'algorithme kMeans, et comparer le résultat avec les vraies classes.

kMeans - clustering des images en 2 dimensions

En comparant le clustering sur les données à basse dimensions avec les vraies classes, on obtient un ARI score de 0.125, ce qui est relativement peu.

Le score n'est pas très élevé car les images ont été traitées avant l'utilisation de l'algo SIFT, et l'extraction de features ne permet pas d'extraire d'élement caractéristique pertinent dans chaque image.

Utilisation d'un CNN (Réseau de neurones convolutif)

On va essayer d'obtenir un score plus important en utilisant cette fois ci un Réseau de neurones convolutif (CNN).

Les réseaux de neurones convolutifs désignent une sous-catégorie de réseaux de neurones. Les CNN sont spécialement conçus pour traiter des images en entrée.

Exemple avec l'algo VGG16

On va utiliser l'algorithme pré entraîné VGG16, qui permet de classifier une image parmis 1000 classes.

Cet algortihme a été entraîné sur un échantillon de millions d'images provenant d'ImageNet.

Voici la représentation 3D de son architecture, on y voit les différentes couches.

vgg16.png

Comme exemple d'utilisation de cet algortihme, on va récupérer une image pour voir comment celle ci est classifiée.

La classification est assez précise, et fournis un pourcentage de probabilité d'appartenance à plusieurs classes. Ici on a restaurant qui ressort avec 11%.

Extraction de features

On va réutiliser cet algorithme VGG16 pré-entraîné, en désactivant simplement la couche top qui sert de classification, pour prédire les features à partir de nos images.

L'intérêt est ensuite de classifier via un kMeans les features obtenues et comparer avec les vraies classes, pour voir si l'on obient un meilleur ARI score qu'avec la méthode SIFT.

On va maintenant réduire le nombre de dimensions avec l'ACP, et on garde un nombre de dimensions de façon à avoir une variance expliquée à 99%.

On passe de 25088 à 928 features avec l'ACP.

On va maintenant réduire l'espace de dimension avec l'algorithme TSNE, pour obtenir 2 dimensions et pouvoir visualiser sous forme de nuage de points les images et leur label associé.

Cette fois ci, la classification est mieux réalisée qu'avec le SIFT. On distingue bien les 5 classes.

On va maintenant clusteriser ces données en 2 dimensions avec l'algorithme kMeans, et comparer le résultat avec les vraies classes.

On obtient un bien meilleur ARI score que précedemment. Il est ici de 0.54

Transfer Learning

Avec le transfer learning, ou apprentissage par transfert, on va ré-entraîner une partie du réseau sur les nouvelles classes (nos 5 classes), afin d'y faire par la suite une classification sur ces 5 classes plutôt que sur les 1000 classes du modèle pré-entraîné.

On va donc récupérer certaines couches du VGG16 que l'on va ré-entraîner.

On a une précision de 88% ce qui est beaucoup plus que toutes les méthodes précédentes !

En utilisant l'aglorithme VGG16 ré-entraîné sur nos classes, on obient une très bonne précision, de l'ordre de 90%.

La matrice de confusion nous permet d'observer comment chaque image est prédite en fonction de sa vraie classe.